﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using TccServicos.Models;
using TccServicos.Util;

namespace TccServicos.Controllers
{
    public class CombosController : ApiController
    {
        #region Atributos
        private string sThread = "";
        #endregion

        #region WebApis do TCC Combos
        [HttpGet]
        public RetornoCombos GetCombos([FromUri] bool? simulaTimeout = false, [FromUri] bool? simulaErro = false,
            [FromUri] int? idGenero = null, [FromUri] int? idRaca = null, [FromUri] int? idPorte = null, 
            [FromUri] int? idUf = null, [FromUri] int? idCidade = null, [FromUri] bool? pesquisarCidades = true)
        {
            sThread = Util.Util.NextHex(4);
            string nomeFuncao = string.Format("{0} [{1}]", "GetCombos", sThread);

            try
            {
                if (simulaTimeout.HasValue && simulaTimeout.Value)
                {
                    System.Threading.Thread.Sleep(100000);
                }

                if (simulaErro.HasValue && simulaErro.Value)
                {
                    throw new Exception("Simulação de Erro!");
                }

                using (adoteEntities contexto = new adoteEntities())
                {
                    var consultaRaca = (from t in contexto.CADASTRO_RACA.AsNoTracking()
                                        select new Combo
                                        {
                                            tipo = "Raca",
                                            id = t.ID_RACA,
                                            id2 = 0,
                                            descricao = t.RACA,
                                        });

                    var consultaGenero = (from t in contexto.CADASTRO_GENERO.AsNoTracking()
                                          select new Combo
                                          {
                                              tipo = "Genero",
                                              id = t.ID_GENERO,
                                              id2 = 0,
                                              descricao = t.GENERO,
                                          });

                    var consultaPorte = (from t in contexto.CADASTRO_PORTE.AsNoTracking()
                                         select new Combo
                                         {
                                             tipo = "Porte",
                                             id = t.ID_PORTE,
                                             id2 = 0,
                                             descricao = t.PORTE,
                                         });

                    var consultaUf = (from t in contexto.CADASTRO_UF.AsNoTracking()
                                      select new Combo
                                      {
                                          tipo = "Uf",
                                          id = t.ID_UF,
                                          id2 = 0,
                                          descricao = t.UF,
                                      });

                    var consultaCidade = (from t in contexto.CADASTRO_CIDADE.AsNoTracking()
                                          select new Combo
                                          {
                                              tipo = "Cidade",
                                              id = t.ID_CIDADE,
                                              id2 = t.ID_UF,
                                              descricao = t.CIDADE,
                                          });

                    if (idGenero.HasValue && idGenero.Value > 0)
                        consultaGenero = consultaGenero.Where(x => x.id > idGenero.Value);
                    if (idRaca.HasValue && idRaca.Value > 0)
                        consultaRaca = consultaRaca.Where(x => x.id > idRaca.Value);
                    if (idPorte.HasValue && idPorte.Value > 0)
                        consultaPorte = consultaPorte.Where(x => x.id > idPorte.Value);
                    if (idUf.HasValue && idUf.Value > 0)
                        consultaUf = consultaUf.Where(x => x.id > idUf.Value);
                    if (idCidade.HasValue && idCidade.Value > 0)
                        consultaCidade = consultaCidade.Where(x => x.id > idCidade.Value);
                
                    /*
                    var retorno = consultaRaca.
                        Union(consultaGenero).
                        Union(consultaPorte).
                        Union(consultaUf).
                        Union(consultaCidade).
                        OrderBy(x => x.tipo).
                        ThenBy(x => x.descricao).ToList();
                    */
                    var retorno = consultaRaca.
                        Union(consultaGenero).
                        Union(consultaPorte).
                        Union(consultaUf);
                    if (pesquisarCidades.HasValue && pesquisarCidades.Value)
                        retorno = retorno.Union(consultaCidade);

                    var resultado = retorno.OrderBy(x => x.tipo).
                        ThenBy(x => x.descricao).ToList();

                    Log.GravarLog(string.Format("{0}: {1}", nomeFuncao, Validacao.consultaComSucesso));

                    return new RetornoCombos() { lista = resultado };
                }
            }
            catch (Exception ex)
            {
                Log.GravarLog(string.Format("{0} Erro: {1}", nomeFuncao, ex.ToString()));
                return default(RetornoCombos);
            }
        }

        [HttpPost]
        public RetornoServico SaveTest(Genero genero)
        {
            sThread = Util.Util.NextHex(4);
            string nomeFuncao = string.Format("{0} [{1}]", "SaveGenero", sThread);

            try
            {

                if (genero.genero == "timeout")
                {
                    System.Threading.Thread.Sleep(100000);
                }

                if (genero.genero == "erro")
                {
                    throw new Exception("Simulação de Erro!");
                }

                return default(RetornoServico);
            }
            catch (Exception ex)
            {
                Log.GravarLog(string.Format("{0} Erro: {1}", nomeFuncao, ex.ToString()));
                return Util.Util.RetornoErro(ex.ToString());
            }
        }
        #endregion
    }
}
